/**
    \file tp5.cpp

    \brief Programme d'aide au pilote.

    \author   Clement Zotti 11074801
    \author   Ousmane Iria 10100204
    \date     22/03/2012
    \version  v1.0

    <b>Entrees:</b>
        \li (\c clavier) coordonnées du pilote  (\c chaine de caractères)
        \li (\c clavier) action à effectue  (\c chaine de caractères)
        \li (\c fichier) Fichier de coordonnées  (\c chaines de caractères)

    <b>Sorties:</b>
        \li (\c écran) liste des aéroports ainsi que de leurs coordonnées (\c chaine de caractères)

    Ce programme aide le pilote pour le choix d'un aéroport, selon
    la méthode de tri choisie. Dans un premier temps, le pilote
    entre ses coordonnées GPS dans le programme. Ensuite il choisie une action
    entre ("alpha.", "distance.", "suivant.", "fin."), en fonction de ce choix
    soit le programme tri en fonction des coordonnées, soit en fonction des
    distance le séparant des aéroports. Ou il peut a nouveau rentrer ses
    nouvelles coordonnées et enfin il peut aussi mettre fin au programme.

    Date de la premiere version: 22/03/2012 \n

    Date de modification:
        \li 22/03/2012, modification des fonctions et ajout des commentaires, Clement Zotti
*/

#define MAX_IMAGE 25
#define _DEBUG

/*-- Bibliotheques utilisees en ordre alphabetique --*/
#include <cmath>
#include <fstream>
#include <iostream>
#include <cstring>
#include "tp5_struct.cpp"
//#include "tp5_tri.cpp"


using namespace std;

/**
    \brief Description sommaire de la fonction (i.e. du programme)
  */

int main(void)
{
    // Déclaration des focntions;
    void manipulation_image();

    // Boucle principale

    manipulation_image();

    // retour
    return 0;
}


/**
  \brief Fonction pricipale du programme du traitement d'image.

  Cette fonction manipule les images contenus dans la liste

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in,out] liste (Tableau de structure image)
 **/
void manipulation_image()
{
    int ajout_image(struct image_8_bits_t &);
    int retirer_image (image_8_bits_t []);
    int affiche_image (image_8_bits_t []);

    // Déclaration des variables
    image_8_bits_t liste_image[MAX_IMAGE];

    ajout_image(liste_image[0]);
    affiche_image(liste_image);
}

/**
  \brief Ouverture du fichier pour traitement.

  Cette fonction ouvre un fichier dont le nom est entré au clavier
  et repartit les elements du fichier dans deux tableaux.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in,out] nom (Matrice de caractères pour le nom des aéroports)
  \param[in,out] coord (Matrice de coordonnées)

  \return le nombre d'aéroports présent dans le fichier.
 **/
int retirer_image (image_8_bits_t image[])
{
    // Declaration des fonctions utilisees dans la fonction

    // Declaration des variables locales

    // Corps de la fonction

    return 0;
    // ne pas oublier le retour
}

/**
  \brief Ouverture du fichier pour traitement.

  Cette fonction ouvre un fichier dont le nom est entré au clavier
  et repartit les elements du fichier dans deux tableaux.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in,out] nom (Matrice de caractères pour le nom des aéroports)
  \param[in,out] coord (Matrice de coordonnées)

  \return le nombre d'aéroports présent dans le fichier.
 **/
int affiche_image (image_8_bits_t image[])
{
    // Corps de la fonction
    for (int i = 0 ; i < 1 ; i++)
    {
        cout << "Date : " << image[i].date << endl
             << "ID : " << image[i].identificateur << endl
             << "Moyenne=" << image[i].moyenne
             << ", Variance="<< image[i].variance
             << ", Sigma"<< image[i].sigma << endl
             << ", Skewness="<<  image[i].skewness
             << ", Kurtosis="<< image[i].kurtosis << endl;
    }

    return 0;
    // ne pas oublier le retour
}

/**
  \brief Ouverture du fichier pour traitement.

  Cette fonction ouvre un fichier dont le nom est entré au clavier
  et repartit les elements du fichier dans deux tableaux.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in,out] nom (Matrice de caractères pour le nom des aéroports)
  \param[in,out] coord (Matrice de coordonnées)

  \return le nombre d'aéroports présent dans le fichier.
 **/
int lecture_action (image_8_bits_t image[])
{
    // Declaration des fonctions utilisees dans la fonction

    // Declaration des variables locales

    // Corps de la fonction

    return 0;
    // ne pas oublier le retour
}

/**
  \brief Ouverture du fichier pour traitement.

  Cette fonction ouvre un fichier dont le nom est entré au clavier
  et repartit les elements du fichier dans deux tableaux.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in,out] nom (Matrice de caractères pour le nom des aéroports)
  \param[in,out] coord (Matrice de coordonnées)

  \return le nombre d'aéroports présent dans le fichier.
 **/
int ajout_image (image_8_bits_t &image)
{
    // Declaration des fonctions utilisees dans la fonction
    void calcul_moyenne (image_8_bits_t &);
    void calcul_variance (image_8_bits_t &);
    void calcul_skewness (image_8_bits_t &);
    void calcul_kurtosis (image_8_bits_t &);

    // Declaration des variables locales
    bool fOK = false;
    int ajout=0;

    ifstream fImage;

    // Corps de la fonction
    do
    {
        cout << "Entrez le nom du fichier de l'image :";
        cin >> image.nom_fichier;
        fImage.open(image.nom_fichier.c_str(), ios::in);
        if (!fImage)
        {
            fImage.clear();
            cout << "Erreur a l'ouverture." << endl;
        } else
            fOK = true;
    } while (!fOK);
    ajout = 1;

    // AJOUTER UN TEST DE ROBUSTESSE SUR LE FICHIER POUR VÉRIFIER QUE
    // SONT CONTENU SOIT CONFORME A CELUI QU'IL FAUT.

    long pos = fImage.tellg();
    // se placer en fin de fichier
    fImage.seekg( 0 , std::ios_base::end );
    // récupérer la nouvelle position = la taille du fichier
    long size = fImage.tellg() ;
    // restaurer la position initiale du fichier
    fImage.seekg( pos,  std::ios_base::beg ) ;

    cout << "Taille du fichier " << size << endl;


    cout << "Debut WHILE !" << endl;
    for (int i = 0 ; i < image.l_x ; i++)
    {
        for (int j = 0 ; j < image.l_y ; j++)
        {
            image.buff_pixel[i][j] = fImage.get();
        }
    }
    fImage.close();
    cout << "File closed !" << endl;
    //Fin lecture du fichier

    image.moyenne = 60.0;
    calcul_variance(image);
    calcul_skewness(image);


    return ajout;
    // ne pas oublier le retour
}

/**
  \brief Lit les coordonnées du pilote.

  Lit les coordonnées du pilote au clavier, et test si les valeurs sont
  valide, si ce n'est pas le cas, on demande une autre fois cette valeur.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in] nom (Matrice des noms d'aéroports)
  \param[in] coord (Matrice de coordonnées des aéroports)
  \param[in] nb_aero (Nombre d'aéroport lu dans le fichier)

 **/
void calcul_moyenne (image_8_bits_t & image)
{
}

/**
  \brief Lit les coordonnées du pilote.

  Lit les coordonnées du pilote au clavier, et test si les valeurs sont
  valide, si ce n'est pas le cas, on demande une autre fois cette valeur.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in] nom (Matrice des noms d'aéroports)
  \param[in] coord (Matrice de coordonnées des aéroports)
  \param[in] nb_aero (Nombre d'aéroport lu dans le fichier)

 **/
void calcul_variance (image_8_bits_t & image)
{
    for (int i = 0 ; i < image.l_x ; i++)
    {
        for (int j = 0 ; j < image.l_y ; j++)
        {
            image.variance += pow(((int)image.buff_pixel[i][j]-image.moyenne), 2);
        }
    }
    image.variance /= (image.l_x * image.l_y * 1.0);

#ifdef _DEBUG
    cout << "Variance=" << image.variance << endl;
#endif
}

/**
  \brief Lit les coordonnées du pilote.

  Lit les coordonnées du pilote au clavier, et test si les valeurs sont
  valide, si ce n'est pas le cas, on demande une autre fois cette valeur.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in] nom (Matrice des noms d'aéroports)
  \param[in] coord (Matrice de coordonnées des aéroports)
  \param[in] nb_aero (Nombre d'aéroport lu dans le fichier)

 **/
void calcul_skewness (image_8_bits_t & image)
{
    image.sigma = sqrt(image.variance);
    for (int i = 0 ; i < image.l_x ; i++)
    {
        for (int j = 0 ; j < image.l_y ; j++)
        {
            image.skewness += pow(((int)image.buff_pixel[i][j]-image.moyenne), 3);
        }
    }
    image.skewness /= (image.l_x * image.l_y * 1.0);

#ifdef _DEBUG
    cout << "Sigma=" << image.sigma << endl;
    cout << "Skewness=" << image.skewness << endl;
#endif
}

/**
  \brief Lit les coordonnées du pilote.

  Lit les coordonnées du pilote au clavier, et test si les valeurs sont
  valide, si ce n'est pas le cas, on demande une autre fois cette valeur.

  Cette fonction est correcte.
  Cette fonction n'est pas robuste.

  \param[in] nom (Matrice des noms d'aéroports)
  \param[in] coord (Matrice de coordonnées des aéroports)
  \param[in] nb_aero (Nombre d'aéroport lu dans le fichier)

 **/
void calcul_kurtosis (image_8_bits_t & image)
{
}
